package com.itheima.tliaswebmanagement.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.tliaswebmanagement.controller.JwtUtils;
import com.itheima.tliaswebmanagement.mapper.EmpExprMapper;
import com.itheima.tliaswebmanagement.mapper.EmpMapper;
import com.itheima.tliaswebmanagement.pojo.*;
import com.itheima.tliaswebmanagement.service.EmpService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

@Service
public class  EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogServiceImpl empLogServiceImpl;

//    @Override
//    public List<Emp> list() {
//        return empMapper.list();
//    }


//    @Override
//    public PageResult page(Integer beginIndex, Integer pageSize) {
//        Long total = empMapper.count();
//        Integer start= (beginIndex-1)*pageSize;
//        List list = empMapper.list(start,pageSize);
//        return new PageResult(total, list);
//    }

//    @Override
//    public PageResult page(Integer beginIndex, Integer pageSize) {
//        //1.设置分页参数
//        PageHelper.startPage(beginIndex, pageSize);
//        //2.调用Mapper查询分页数据,?Page是List的一个子类?
////        List<Emp> list= empMapper.list();
////        Page<Emp> pageRes=(Page<Emp>)list;
//        Page<Emp> pageRes =empMapper.list();
//
//        return new PageResult(pageRes.getTotal(), pageRes.getResult());
//    }

    @Override
    public PageResult page(EmpQueryParam empQueryParam) {
        //1.设置分页参数
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        //2.调用Mapper查询分页数据,?Page是List的一个子类?
        Page<Emp> pageRes = empMapper.list(empQueryParam);
        return new PageResult(pageRes.getTotal(), pageRes.getResult());

    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(Emp emp) {
        try{
            //补全基础属性
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            //保存员工信息
            empMapper.save(emp);

//            int i=1/0;
            //批量保存员工的工作经历信息
            Integer empId = emp.getId();
            List<EmpExpr> exprList = emp.getExprList();
            if (!CollectionUtils.isEmpty(exprList)) {
                exprList.forEach(new Consumer<EmpExpr>() {
                    @Override
                    public void accept(EmpExpr empExpr) {
                        empExpr.setEmpId(empId);
                    }
                });
                empExprMapper.saveBatch(exprList);
            }
        }finally {
            EmpLog empLog = new EmpLog(null,LocalDateTime.now(),emp.toString());
            empLogServiceImpl.insertLog(empLog);
        }

    }

    @Transactional
    @Override
    public void deleteByIds(List<Integer> ids) {
        //1.删除员工信息表数据
        empMapper.deleteByIds(ids);

        //2.删除员工工作经历表数据
        empExprMapper.deleteByEmpIds(ids);
    }

    @Override
    public Emp getInfo(Integer id) {
        return empExprMapper.getInfoById(id);
    }

    @Override
    public void update(Emp emp) {
        //1.员工信息表
        //补充基础属性(修改时间)
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
        //2.员工工作经历表
        /**
         * 情况1.原有数据不变，新增经历
         * 情况2.删除原有数据其中的部数据
         * 情况3.修改其中的部分数据
         * ...等等等等  由于情况太多，因此我们决定：
         */
        //先删除
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        //再新增
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            //设置员工ID
            exprList.forEach(new Consumer<EmpExpr>() {
                @Override
                public void accept(EmpExpr empExpr) {
                    empExpr.setEmpId(emp.getId());
                }
            });
            empExprMapper.saveBatch(exprList);
        }
    }

    @Override
    public List<Emp> findAll() {
        return empMapper.findAll();
    }

    @Override
    public LoginInfo login(Emp emp) {
        Emp loginEmp = empMapper.login(emp);
        if (loginEmp!=null) {
            //生成token
            Map<String, Object> map=new HashMap<>();
            map.put("id",loginEmp.getId());
            map.put("username",loginEmp.getUsername());
            String jwt = JwtUtils.generateJwt(map);

            return new LoginInfo(loginEmp.getId(),loginEmp.getUsername(),loginEmp.getName(),jwt);
        }
        return null;
    }
}
